package com.neucrack.GUI; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import com.iflytek.cloud.speech.SpeechConstant; import com.iflytek.cloud.speech.SpeechError; import com.iflytek.cloud.speech.SpeechSynthesizer; import com.iflytek.cloud.speech.SpeechUtility; import com.iflytek.cloud.speech.SynthesizerListener; import com.melloware.jintellitype.HotkeyListener; import com.melloware.jintellitype.JIntellitype; import com.neucrack.AutoUpdata.AutoUpdata; import com.neucrack.DataPersistence.PreferenceData; import com.neucrack.Help_Update.Help; import com.neucrack.protocol.Bamboo; import com.neucrack.protocol.ConnectDanMuServer; import com.neucrack.protocol.Danmu; import com.neucrack.protocol.Gift; import com.neucrack.protocol.Platform; import com.neucrack.protocol.User; import com.neucrack.protocol.Visitors; import java.awt.GridLayout; import javax.swing.DefaultListModel; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JSlider; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.JScrollPane; import javax.swing.JList; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Insets; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.MouseInputListener; import java.awt.Toolkit; import javax.swing.ImageIcon; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.FlowLayout; import java.io.IOException; import java.util.Vector; import javax.swing.SwingConstants; public class PandaTVDanmu extends JFrame { /** * */ private static final long serialVersionUID = 4541332569550717643L; private JPanel contentPane; static Point origin = new Point(); private JTextField mRoomID; private JList<ListItemDanMu> mMessageList; final JFrame parentPanel=this; private boolean mLock=false; private boolean mIsConnectionAlive=false; private boolean mIsAutoScroll=true; private DefaultListModel<ListItemDanMu> mListItem; private int mTransparentValue=0,mTransparentValueBefore=0; private boolean mIsChangeFrameSize=false; private int mMaxDanMuDisNumber; // DefaultListModel listModel; int mMessagelastIndex=0; private ConnectDanMuServer mDanMuConnection; private JLabel mVisitorNum; private JPanel panel_header_1; private JPanel panel_header_2_left; private JLabel label; private JLabel mLockHint; private JLabel mCloseWindow; private JPanel panel_1_left; private JPanel panel_2_right; private JLabel mStartStopConnection; private JLabel mPauseAutoScroll; private JScrollPane scrollPane; private JLabel mHelp; SpeechSynthesizer mTts; private String mVoiceName; private boolean mIsVoicing=false; private boolean mIsEnableVoice=false; private Vector<String> mVoiceContent = new Vector<String>(); //定义热键标识,用于在设置多个热键时,在事件处理中区分用户按下的热键 public static final int FUNC_KEY_MARK = 1; private JPanel panel_header_2; private JPanel panel_header_2_right; private JLabel mSettings; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { //String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; //UIManager.setLookAndFeel(lookAndFeel); PandaTVDanmu frame = new PandaTVDanmu(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public PandaTVDanmu() { addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_CONTROL){ scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); } } @Override public void keyReleased(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_CONTROL){ scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); } } }); setIconImage(Toolkit.getDefaultToolkit().getImage(PandaTVDanmu.class.getResource("/pic/icon.png"))); setBackground(Color.BLACK); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(600, 250, 272, 323); mDanMuConnection = new ConnectDanMuServer(this); contentPane = new JPanel(); contentPane.setBorder(new Border(new Color(0,0,0,0.8f), 5, this)); contentPane.setOpaque(false); setContentPane(contentPane); contentPane.setLayout(new BorderLayout(0, 0)); JPanel panelHeader = new JPanel(); panelHeader.setBackground(Color.DARK_GRAY); panelHeader.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); contentPane.add(panelHeader, BorderLayout.NORTH); panelHeader.setOpaque(false); panelHeader.setLayout(new BorderLayout(0, 0)); panel_header_1 = new JPanel(); panelHeader.add(panel_header_1, BorderLayout.NORTH); panel_header_1.setOpaque(false); panel_header_1.setLayout(new BorderLayout(0, 0)); panel_1_left = new JPanel(); panel_header_1.add(panel_1_left, BorderLayout.WEST); panel_1_left.setOpaque(false); mVisitorNum = new JLabel("0"); panel_1_left.add(mVisitorNum); mVisitorNum.setHorizontalAlignment(SwingConstants.LEFT); mVisitorNum.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/audience.png"))); mVisitorNum.setBackground(Color.DARK_GRAY); mVisitorNum.setForeground(Color.WHITE); panel_2_right = new JPanel(); panel_header_1.add(panel_2_right, BorderLayout.EAST); panel_2_right.setOpaque(false); mLockHint = new JLabel("F10锁定"); panel_2_right.add(mLockHint); mLockHint.setForeground(Color.WHITE); mHelp = new JLabel(""); mHelp.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { JDialog helpDialog = new JDialog(parentPanel, "Neucrack_PandaTV 弹幕助手 帮助", null); helpDialog.setBounds(500, 150, 550, 323); Help helpInfo=new Help(); helpDialog.getContentPane().setLayout(new FlowLayout()); JTextArea helpMessage = new JTextArea(helpInfo.getmHelpMessage()); JTextArea aboutMaker = new JTextArea(helpInfo.getmAboutMaker()); helpMessage.setOpaque(false); aboutMaker.setOpaque(false); helpDialog.getContentPane().add(helpMessage); helpDialog.getContentPane().add(aboutMaker); helpDialog.setVisible(true); } }); mSettings = new JLabel(""); mSettings.setCursor(new Cursor(Cursor.HAND_CURSOR)); mSettings.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { class MyJDialog extends JDialog implements WindowListener{ /** * */ private static final long serialVersionUID = 6317261328052074874L; public MyJDialog(JFrame parentPanel, String string) { super(parentPanel,string); this.addWindowListener((WindowListener) this); } public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub // System.out.println("1"); } public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub // System.out.println("2"); } public void windowClosed(WindowEvent e) { // System.out.println("3"); } public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub // System.out.println("4"); } public void windowDeiconified(WindowEvent e) { // System.out.println("5"); } public void windowActivated(WindowEvent e) { // System.out.println("6"); mTransparentValueBefore = mTransparentValue; } public void windowDeactivated(WindowEvent e) { // System.out.println("7"); parentPanel.setOpacity((float) ((mTransparentValueBefore+100-PreferenceData.MAXTRASPARENTVALUE)/100.0)); } } MyJDialog settingsDialog = new MyJDialog(parentPanel, "Neucrack_PandaTV 弹幕助手 设置"); settingsDialog.setBounds(500, 150, 350, 250); settingsDialog.getContentPane().setLayout(new GridLayout(0, 1)); JPanel transparentPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); JPanel rememberRoomIDPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); JPanel disNumber = new JPanel(new FlowLayout(FlowLayout.CENTER)); JPanel voiceSetting = new JPanel(new FlowLayout(FlowLayout.CENTER)); JPanel applyPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); final JLabel transparentLabel=new JLabel("透明度 0%"); final JSlider slider = new JSlider(0, PreferenceData.MAXTRASPARENTVALUE, PreferenceData.MAXTRASPARENTVALUE); final JCheckBox isRemenberRoomID = new JCheckBox("保存房间号"); JLabel disNumberName = new JLabel("保留消息个数"); final JTextField disNumberInput = new JTextField(); final JCheckBox isEnableVoice = new JCheckBox("使能语音"); JLabel voiceName=new JLabel("人物"); Vector<String> str = new Vector<String>(); str.add("小燕"); str.add("小宇"); str.add("小峰"); str.add("小梅"); str.add("小蓉"); final JComboBox<String> comboBox = new JComboBox<String>(str); disNumberInput.setColumns(6); JButton apply = new JButton("应用"); slider.setCursor(new Cursor(Cursor.HAND_CURSOR)); PreferenceData prefData=new PreferenceData(); mTransparentValue = prefData.getmTransparentValue(); if(prefData.IsSaveRoomID()) isRemenberRoomID.setSelected(true); else isRemenberRoomID.setSelected(false); transparentLabel.setText("透明度 "+(PreferenceData.MAXTRASPARENTVALUE-mTransparentValue)+"% "); slider.setValue(PreferenceData.MAXTRASPARENTVALUE-mTransparentValue); mIsEnableVoice = prefData.GetIsEnableVoice(); if(mIsEnableVoice) isEnableVoice.setSelected(true); else isEnableVoice.setSelected(false); mVoiceName = prefData.GetVoiceName(); if(mVoiceName.equals("xiaoyan")) comboBox.setSelectedItem("小燕"); else if(mVoiceName.equals("xiaoyu")) comboBox.setSelectedItem("小宇"); else if(mVoiceName.equals("xiaofeng")) comboBox.setSelectedItem("小峰"); else if(mVoiceName.equals("xiaomei")) comboBox.setSelectedItem("小梅"); else if(mVoiceName.equals("xiaorong")) comboBox.setSelectedItem("小蓉"); transparentPanel.add(transparentLabel); transparentPanel.add(slider); rememberRoomIDPanel.add(isRemenberRoomID); disNumber.add(disNumberName); disNumber.add(disNumberInput); voiceSetting.add(isEnableVoice); voiceSetting.add(voiceName); voiceSetting.add(comboBox); applyPanel.add(apply); settingsDialog.getContentPane().add(transparentPanel); settingsDialog.getContentPane().add(rememberRoomIDPanel); settingsDialog.getContentPane().add(disNumber); settingsDialog.getContentPane().add(voiceSetting); settingsDialog.getContentPane().add(applyPanel); disNumberInput.setText(mMaxDanMuDisNumber+""); settingsDialog.setVisible(true); slider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { mTransparentValue = PreferenceData.MAXTRASPARENTVALUE - slider.getValue(); transparentLabel.setText("透明度 "+(PreferenceData.MAXTRASPARENTVALUE-mTransparentValue)+"% "); parentPanel.setOpacity((float) ((mTransparentValue+100-PreferenceData.MAXTRASPARENTVALUE)/100.0)); } }); apply.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { parentPanel.setOpacity((float) ((mTransparentValue+100-PreferenceData.MAXTRASPARENTVALUE)/100.0)); mTransparentValueBefore = mTransparentValue; PreferenceData prefData=new PreferenceData(); prefData.SaveTransparentValue(mTransparentValue); if(isRemenberRoomID.isSelected()){ prefData.SaveIsSaveRoomID(true); prefData.SaveRoomID(mRoomID.getText()); } else prefData.SaveIsSaveRoomID(false); try{ mMaxDanMuDisNumber = Integer.parseInt(disNumberInput.getText().trim()); }catch(Exception err){ JDialog errDialog = new JDialog(parentPanel, "错误", null); errDialog.setBounds(520, 160, 200, 150); JLabel hint = new JLabel("格式填写错误!"); errDialog.add(hint); errDialog.setVisible(true); } prefData.SaveDanMuDisNumber(mMaxDanMuDisNumber); if(comboBox.getSelectedItem().equals("小燕")) mVoiceName = "xiaoyan"; else if(comboBox.getSelectedItem().equals("小宇")) mVoiceName = "xiaoyu"; else if(comboBox.getSelectedItem().equals("小峰")) mVoiceName = "xiaofeng"; else if(comboBox.getSelectedItem().equals("小梅")) mVoiceName = "xiaomei"; else if(comboBox.getSelectedItem().equals("小蓉")) mVoiceName = "xiaorong"; prefData.SaveVoiceName(mVoiceName); mTts.setParameter(SpeechConstant.VOICE_NAME, mVoiceName);//设置发音人 if(isEnableVoice.isSelected()){ mIsEnableVoice = true; prefData.SaveIsEnableVoicee(true); } else{ mIsEnableVoice = false; prefData.SaveIsEnableVoicee(false); } } }); } }); mSettings.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/settings.png"))); panel_2_right.add(mSettings); panel_2_right.add(mHelp); mHelp.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/help.png"))); mHelp.setCursor(new Cursor(Cursor.HAND_CURSOR)); mCloseWindow = new JLabel(""); panel_2_right.add(mCloseWindow); mCloseWindow.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/close.png"))); mCloseWindow.setCursor(new Cursor(Cursor.HAND_CURSOR)); panel_header_2 = new JPanel(); panel_header_2.setOpaque(false); panelHeader.add(panel_header_2, BorderLayout.SOUTH); panel_header_2.setLayout(new BorderLayout(0, 0)); panel_header_2_left = new JPanel(); panel_header_2.add(panel_header_2_left, BorderLayout.WEST); panel_header_2_left.setOpaque(false); GridBagLayout gbl_panel_header_2_left = new GridBagLayout(); gbl_panel_header_2_left.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; gbl_panel_header_2_left.rowHeights = new int[]{0, 0}; gbl_panel_header_2_left.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; gbl_panel_header_2_left.rowWeights = new double[]{0.0, Double.MIN_VALUE}; panel_header_2_left.setLayout(gbl_panel_header_2_left); label = new JLabel("房间"); label.setForeground(Color.WHITE); GridBagConstraints gbc_label = new GridBagConstraints(); gbc_label.insets = new Insets(0, 0, 0, 5); gbc_label.gridx = 0; gbc_label.gridy = 0; panel_header_2_left.add(label, gbc_label); mRoomID = new JTextField(); mRoomID.setBorder(new EmptyBorder(0,0,0,0)); //加载持久化数据 PreferenceData prefData=new PreferenceData(); if(prefData.IsSaveRoomID()){ mRoomID.setText(prefData.GetRoomID()); } else{ mRoomID.setText(PreferenceData.DEFAULT_ROOMID); } mMaxDanMuDisNumber = prefData.GetDanMuDisNumber(); GridBagConstraints gbc_mRoomID = new GridBagConstraints(); gbc_mRoomID.insets = new Insets(0, 0, 0, 5); gbc_mRoomID.gridx = 1; gbc_mRoomID.gridy = 0; panel_header_2_left.add(mRoomID, gbc_mRoomID); mRoomID.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER){ if(mIsConnectionAlive){ CloseConnection(); mStartStopConnection.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/StartConnection.png"))); mPauseAutoScroll.setVisible(false); } StartConnection(); mStartStopConnection.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/StopConnection.png"))); mPauseAutoScroll.setVisible(true); mPauseAutoScroll.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/StopAutoscroll.png"))); PreferenceData prefData = new PreferenceData(); if(prefData.IsSaveRoomID()) prefData.SaveRoomID(mRoomID.getText()); else prefData.SaveRoomID(PreferenceData.DEFAULT_ROOMID); } } }); mRoomID.setBackground(Color.DARK_GRAY); mRoomID.setForeground(Color.WHITE); mRoomID.setColumns(10); mStartStopConnection = new JLabel(""); mStartStopConnection.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/StartConnection.png"))); mStartStopConnection.setCursor(new Cursor(Cursor.HAND_CURSOR)); mStartStopConnection.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { if(mIsConnectionAlive){ CloseConnection(); } else{ StartConnection(); mStartStopConnection.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/StopConnection.png"))); mPauseAutoScroll.setVisible(true); mPauseAutoScroll.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/StopAutoscroll.png"))); } } }); GridBagConstraints gbc_mStartStopConnection = new GridBagConstraints(); gbc_mStartStopConnection.insets = new Insets(0, 0, 0, 5); gbc_mStartStopConnection.gridx = 2; gbc_mStartStopConnection.gridy = 0; panel_header_2_left.add(mStartStopConnection, gbc_mStartStopConnection); mPauseAutoScroll = new JLabel(""); mPauseAutoScroll.setCursor(new Cursor(Cursor.HAND_CURSOR)); mPauseAutoScroll.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { if(mIsAutoScroll){//目前是自动滚屏 mIsAutoScroll=false; mPauseAutoScroll.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/StartConnection.png"))); } else{ mIsAutoScroll=true; mPauseAutoScroll.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/StopAutoscroll.png"))); } } }); GridBagConstraints gbc_mPauseAutoScroll = new GridBagConstraints(); gbc_mPauseAutoScroll.insets = new Insets(0, 0, 0, 5); gbc_mPauseAutoScroll.gridx = 3; gbc_mPauseAutoScroll.gridy = 0; panel_header_2_left.add(mPauseAutoScroll, gbc_mPauseAutoScroll); panel_header_2_right = new JPanel(); panel_header_2_right.setOpaque(false); panel_header_2.add(panel_header_2_right, BorderLayout.EAST); mCloseWindow.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { System.exit(0); } @Override public void mouseEntered(MouseEvent e) { mCloseWindow.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/close_hover.png"))); } @Override public void mousePressed(MouseEvent e) { mCloseWindow.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/close_pressed.png"))); } @Override public void mouseExited(MouseEvent e) { mCloseWindow.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/close.png"))); } }); scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.getHorizontalScrollBar().setPreferredSize(new Dimension(0,0)); scrollPane.getVerticalScrollBar().setPreferredSize(new Dimension(0,0)); scrollPane.setOpaque(false);//设置透明 scrollPane.getViewport().setOpaque(false); contentPane.add(scrollPane, BorderLayout.CENTER); mListItem = new DefaultListModel<ListItemDanMu>(); mMessageList = new JList<ListItemDanMu>(mListItem); mMessageList.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_CONTROL){ scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); } } @Override public void keyReleased(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_CONTROL){ scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); } } }); mMessageList.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { // 当鼠标按下的时候获得窗口当前的位置 if(!mLock){ if(mIsChangeFrameSize) return; origin.x = e.getX(); origin.y = e.getY(); } } }); mMessageList.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { // 当鼠标拖动时获取窗口当前位置 if(!mLock){ if(mIsChangeFrameSize) return; Point p =parentPanel.getLocation(); // 设置窗口的位置 // 窗口当前的位置 + 鼠标当前在窗口的位置 - 鼠标按下的时候在窗口的位置 parentPanel.setLocation(p.x + e.getX() - origin.x, p.y + e.getY()- origin.y); } } }); mMessageList.setCellRenderer(new ListRenderer()); mMessageList.setBorder(null); mMessageList.setBackground(new Color(0, 0, 0, 0)); mMessageList.setOpaque(false);//设置透明 mMessageList.setBorder(new EmptyBorder(0,0,0,0)); //((JLabel)mMessageList.getCellRenderer()).setOpaque(false);//设置jlist条目透明,不是自己构造listrenderer时使用 scrollPane.setViewportView(mMessageList); this.setAlwaysOnTop(true);//窗口置顶 this.setTitle("PandaTVDanMu"); this.setUndecorated(true); //AWTUtilities.setWindowOpacity(this, 1f);//设置透明度 mTransparentValue = prefData.getmTransparentValue(); this.setOpacity((float) ((mTransparentValue+100-PreferenceData.MAXTRASPARENTVALUE)/100.0)); this.validate(); this.addMouseListener(new MouseAdapter() { // 按下(mousePressed 不是点击,而是鼠标被按下没有抬起) public void mousePressed(MouseEvent e) { // 当鼠标按下的时候获得窗口当前的位置 if(!mLock){ if(mIsChangeFrameSize) return; origin.x = e.getX(); origin.y = e.getY(); } } }); this.addMouseMotionListener(new MouseMotionAdapter() { // 拖动(mouseDragged 指的不是鼠标在窗口中移动,而是用鼠标拖动) public void mouseDragged(MouseEvent e) { // 当鼠标拖动时获取窗口当前位置 if(!mLock){ if(mIsChangeFrameSize) return; Point p =parentPanel.getLocation(); // 设置窗口的位置 // 窗口当前的位置 + 鼠标当前在窗口的位置 - 鼠标按下的时候在窗口的位置 parentPanel.setLocation(p.x + e.getX() - origin.x, p.y + e.getY()- origin.y); } } }); String osName = System.getProperties().getProperty("os.name"); if(osName.startsWith("win")||osName.startsWith("Win")){ //全局热键 JIntellitype.getInstance().registerHotKey(FUNC_KEY_MARK,0, KeyEvent.VK_F10); JIntellitype.getInstance().addHotKeyListener(new HotkeyListener() { public void onHotKey(int arg0) { switch (arg0) { case FUNC_KEY_MARK: if(mLock){ UnLock(); mLock = false; } else{ Lock(); mLock=true; } break; } } }); } mIsEnableVoice = prefData.GetIsEnableVoice(); mVoiceName = prefData.GetVoiceName(); SpeechUtility.createUtility(SpeechConstant.APPID+"="+PreferenceData.TTS_APPID); //1.创建 SpeechSynthesizer 对象 mTts= SpeechSynthesizer.createSynthesizer( ); //2.合成参数设置,详见《iFlytek MSC Reference Manual》SpeechSynthesizer 类 mTts.setParameter(SpeechConstant.VOICE_NAME, mVoiceName);//设置发音人 mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速 mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围 0~100 //设置合成音频保存位置(可自定义保存位置),保存在“./iflytek.pcm” //如果不需要保存合成音频,注释该行代码 mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, null); //自动检测工版本更新 final String latestVersionAddr = AutoUpdata.DetectLatestVersion(); if(latestVersionAddr!=null){//有最新版 JDialog hint = new JDialog(parentPanel, "有新版本发布啦。。。。"); hint.setBounds(600, 250, 250, 150); hint.setLayout(new GridLayout(0, 1) ); JLabel text = new JLabel("当前版本:"+AutoUpdata.VERSION+"\r\n最新:"+latestVersionAddr.substring(latestVersionAddr.indexOf("download/V")+9, latestVersionAddr.indexOf("/", latestVersionAddr.indexOf("download/V")+10))); JButton confirmButton = new JButton("更新", null); hint.add(text); hint.add(confirmButton); hint.setVisible(true); hint.setFocusable(true); confirmButton.addMouseListener(new MouseListener() { public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub java.net.URI uri = java.net.URI.create(latestVersionAddr); // 获取当前系统桌面扩展 java.awt.Desktop dp = java.awt.Desktop.getDesktop(); // 判断系统桌面是否支持要执行的功能 if (dp.isSupported(java.awt.Desktop.Action.BROWSE)) { //File file = new File("D:\\aa.txt"); //dp.edit(file);//  编辑文件 try { dp.browse(uri); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }// 获取系统默认浏览器打开链接 // dp.open(file);// 用默认方式打开文件 // dp.print(file);// 用打印机打印文件 } } }); } } //合成监听器 private SynthesizerListener mSynListener = new SynthesizerListener(){ //会话结束回调接口,没有错误时,error为null public void onCompleted(SpeechError error) { if(mVoiceContent.size()>0){ mTts.startSpeaking(mVoiceContent.get(0), mSynListener); mVoiceContent.remove(0);//移除已经添加到语音中的 } else{ mIsVoicing = false; } int speed = mVoiceContent.size()*10+49; if(speed>100) speed=100; mTts.setParameter(SpeechConstant.SPEED,speed+""); // System.out.println("complete"); } //缓冲进度回调 //percent为缓冲进度0~100,beginPos为缓冲音频在文本中开始位置,endPos表示缓冲音频在 public void onBufferProgress(int percent, int beginPos, int endPos, String info) { // System.out.println("buffer progress"); } //开始播放 public void onSpeakBegin() { // System.out.println("speak begin"); } //暂停播放 public void onSpeakPaused() { // System.out.println("speak paused"); } //播放进度回调 //percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在 public void onSpeakProgress(int percent, int beginPos, int endPos) { // System.out.println("speak progress"); } //恢复播放回调接口 public void onSpeakResumed() { // System.out.println("speak resumed"); } }; private void StartConnection(){ UpdateDanMu(new ListItemDanMu(false, false, null, "", "", "连接中。。。", null, null, null)); if(mDanMuConnection.ConnectToDanMuServer(mRoomID.getText().trim())){//连接成功 mIsConnectionAlive=true; UpdateDanMu(new ListItemDanMu(false, false, null, "", "", "连接弹幕服务器成功", null, null, null)); } else{ mIsConnectionAlive=false; mPauseAutoScroll.setVisible(false); mStartStopConnection.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/StartConnection.png"))); UpdateDanMu(new ListItemDanMu(false, false, null, "", "", "连接弹幕服务器失败!!", null, null, null)); } } public void CloseConnection(){ UpdateDanMu(new ListItemDanMu(false, false, null, "", "", "断开连接中。。。", null, null, null)); if(mDanMuConnection!=null) mDanMuConnection.Close(); mIsConnectionAlive=false; mStartStopConnection.setIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/StartConnection.png"))); mPauseAutoScroll.setVisible(false); UpdateDanMu(new ListItemDanMu(false, false, null, "", "", "与弹幕服务器断开连接成功", null, null, null)); mVoiceContent.clear(); } public void UpdateDanMu(ListItemDanMu message){ while(mListItem.size()>=mMaxDanMuDisNumber) mListItem.removeElementAt(0); mListItem.addElement(message); if(mIsAutoScroll){ mMessagelastIndex = mListItem.getSize() - 1; if (mMessagelastIndex >= 0) { mMessageList.ensureIndexIsVisible(mMessagelastIndex); } } } public void Lock(){ mRoomID.setEnabled(false); mMessageList.setEnabled(false); mStartStopConnection.setVisible(false); mPauseAutoScroll.setVisible(false); mMessageList.setEnabled(false); mHelp.setVisible(false); mCloseWindow.setVisible(false); mSettings.setVisible(false); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); mLockHint.setText("F10解锁"); } public void UnLock(){ mRoomID.setEnabled(true); mMessageList.setEnabled(true); mStartStopConnection.setVisible(true); mPauseAutoScroll.setVisible(true); mMessageList.setEnabled(true); mHelp.setVisible(true); mCloseWindow.setVisible(true); parentPanel.setEnabled(true); mSettings.setVisible(true); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); mLockHint.setText("F10锁定"); } //显示数据 public void UpdateDanMu(Object message){ ListItemDanMu danMuMessage=new ListItemDanMu(); if(message.getClass().equals(Danmu.class)){//弹幕 Danmu danmu = (Danmu) message; danMuMessage.setGift(false); if(danmu.mPlatform.equals(Platform.PLATFORM_Android)||danmu.mPlatform.equals(Platform.PLATFORM_Ios)){ danMuMessage.setPhone(true); danMuMessage.setPhoneIcon(new ImageIcon(PandaTVDanmu.class.getResource("/pic/mobile.png"))); } String userName=danmu.mNickName; if(Integer.parseInt(danmu.mIdentity)>=60){ if(danmu.mIdentity.equals(User.ROLE_MANAGER)){//管理员 danMuMessage.setSymbolAfterUserName("(管理) "); } else if(danmu.mIdentity.equals(User.ROLE_HOSTER)){//主播 danMuMessage.setSymbolAfterUserName("(主播) "); } else if(danmu.mIdentity.equals(User.ROLE_SUPER_MANAGER)){//超管 danMuMessage.setSymbolAfterUserName("(超管) "); } } else danMuMessage.setSymbolAfterUserName(" "); danMuMessage.setUserName(userName); danMuMessage.setMessage(danmu.mContent); if(mIsEnableVoice){ if(!mIsVoicing){ mIsVoicing = true; //3.开始合成 mTts.startSpeaking(danmu.mContent, mSynListener); } else { mVoiceContent.add(danmu.mContent); } } } else if(message.getClass().equals(Bamboo.class)){//竹子 Bamboo bamboo = (Bamboo) message; danMuMessage.setPhone(false); danMuMessage.setGift(true); danMuMessage.setUserName(bamboo.mNickName); danMuMessage.setSymbolAfterUserName(""); danMuMessage.setMessage("送给主播"); danMuMessage.setGiftNumber(bamboo.mContent); danMuMessage.setGiftUnit("个"); danMuMessage.setGiftName("竹子"); if(mIsEnableVoice){ if(!mIsVoicing){ mIsVoicing = true; //3.开始合成 mTts.startSpeaking("感谢 ! "+bamboo.mNickName+"送的"+bamboo.mContent+"个竹子", mSynListener); } else { mVoiceContent.add("感谢 !"+bamboo.mNickName+"送的"+bamboo.mContent+"个竹子"); } } } else if(message.getClass().equals(Visitors.class)){//访客数量 Visitors visitor = (Visitors) message; mVisitorNum.setText(visitor.mContent); return; } else if(message.getClass().equals(Gift.class)){//礼物 Gift gift = (Gift) message; danMuMessage.setPhone(false); danMuMessage.setGift(true); danMuMessage.setUserName(gift.mNickName); danMuMessage.setSymbolAfterUserName(""); danMuMessage.setMessage("送给主播"); danMuMessage.setGiftNumber(gift.mContentCombo); danMuMessage.setGiftUnit("个"); danMuMessage.setGiftName(gift.mContentName); if(mIsEnableVoice){ if(!mIsVoicing){ mIsVoicing = true; //3.开始合成 mTts.startSpeaking("感谢 ! "+gift.mNickName+"送的"+gift.mContentCombo+"个"+gift.mContentName, mSynListener); } else { mVoiceContent.add("感谢 !"+gift.mNickName+"送的"+gift.mContentCombo+"个"+gift.mContentName); } } } UpdateDanMu(danMuMessage); } //边框缩放 class Border extends LineBorder implements MouseInputListener { private static final long serialVersionUID = 1L; private JFrame frame; private int delta; private Point sp; private Point cp; private int width; private int height; private boolean top, bottom, left, right, topLeft, topRight, bottomLeft, bottomRight; public Border(Color color, int delta, JFrame frame) { super(color, delta); this.delta = delta; this.frame = frame; addMouseMotionListener(this); addMouseListener(this); } public void mouseDragged(MouseEvent e) { if(mLock) return; mIsChangeFrameSize=true; Point dp = e.getLocationOnScreen(); // 拖动时的组件原点 int ox = dp.x - cp.x; int oy = dp.y - cp.y; // 静止的 原点 int x = sp.x - cp.x; int y = sp.y - cp.y; int h = height; int w = width; if (top) { ox = x; h = height + (-dp.y + sp.y); } else if (bottom) { oy = y; ox = x; h = height + (dp.y - sp.y); } else if (left) { oy = y; w = width + (-dp.x + sp.x); } else if (right) { oy = y; ox = x; w = width + (dp.x - sp.x); } else if (topLeft) { h = height + (-dp.y + sp.y); w = width + (-dp.x + sp.x); } else if (topRight) { ox = x; h = height + (-dp.y + sp.y); w = width + (dp.x - sp.x); } else if (bottomLeft) { oy = y; h = height + (-dp.y + sp.y); w = width + (dp.x - sp.x); } else if (bottomRight) { ox = x; oy = y; h = height + (dp.y - sp.y); w = width + (+dp.x - sp.x); } frame.setLocation(ox, oy); frame.setSize(w, h); } public void mouseMoved(MouseEvent arg0) { if(mLock) return; sp = arg0.getLocationOnScreen(); cp = arg0.getPoint(); width = frame.getWidth(); height = frame.getHeight(); top = cp.x > delta && cp.x < width - delta && cp.y <= delta; bottom = cp.x > delta && cp.x < width - delta && cp.y >= height - delta; left = cp.x <= delta && cp.y > delta && cp.y < height - delta; right = cp.x >= width - delta && cp.y > delta && cp.y < height - delta; topLeft = cp.x <= delta && cp.y <= delta; topRight = cp.x >= width - delta && cp.y <= delta; bottomLeft = cp.x <= delta && cp.y >= height - delta; bottomRight = cp.x >= width - delta && cp.y >= height - delta; if (top) { frame.setCursor(Cursor .getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); return; } else if (bottom) { frame.setCursor(Cursor .getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); } else if (left) { frame.setCursor(Cursor .getPredefinedCursor(Cursor.W_RESIZE_CURSOR)); } else if (right) { frame.setCursor(Cursor .getPredefinedCursor(Cursor.W_RESIZE_CURSOR)); } else if (topLeft) { frame.setCursor(Cursor .getPredefinedCursor(Cursor.NW_RESIZE_CURSOR)); } else if (topRight) { frame.setCursor(Cursor .getPredefinedCursor(Cursor.SW_RESIZE_CURSOR)); } else if (bottomLeft) { frame.setCursor(Cursor .getPredefinedCursor(Cursor.SW_RESIZE_CURSOR)); } else if (bottomRight) { frame.setCursor(Cursor .getPredefinedCursor(Cursor.NW_RESIZE_CURSOR)); } } public void mouseClicked(MouseEvent arg0) { } public void mouseEntered(MouseEvent arg0) { if(mLock) return; mIsChangeFrameSize=true; } public void mouseExited(MouseEvent arg0) { if(mLock) return; mIsChangeFrameSize=false; frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent arg0) { } public void mouseReleased(MouseEvent arg0) { } } }